<?php

class Action_Node_OpenId extends RL_Handler
{

	public function process ()
	{
		$principal = $this->ctx->principal;
		$profile   = $principal->getProfile();

		if (isset($profile['openid']['sig']) && isset($profile['signed']['identity'])) {
			// в принципале профиль от openid
			// т.е. юзверь аутентифицирован через openid -- ок.
			// наша задача: сопоставить этот профиль, с профилем, хранящимся у нас

			// если юзер есть -- то он разлогинился или еще каким-то образом потерял сессию.
			// нужно аутентифицировать как своего.
			// если необходимо, можно обновить профиль, данными с openid
			//

			// если у нас этот юзер не прописан -- нужно зарегистрировать акк,
			// и заполнить профиль данными из openid
			//

			// в любом случае -- логиним как нашего юзера.

			$openid_profile = $profile;

			$auth_method = $principal->methods['login'];

			$user_login      = $openid_profile['login'];
			$user_name       = isset($openid_profile['signed']['sreg.fullname']) ? $openid_profile['signed']['sreg.fullname'] : $user_login;
			$user_email      = isset($openid_profile['signed']['sreg.email']) ? $openid_profile['signed']['sreg.email'] : NULL;
			$user_openid_url = isset($openid_profile['signed']['identity']) ? $openid_profile['signed']['identity'] : NULL;
//			var_dump($openid_profile);
//			if ($cred = $auth_method->store->loadByLogin($user_login)) {
			$model = $this->ctx->mm->getModel("OpenId", "m");
			if ($cred = $model->find_user_by_openid($user_openid_url)) {
				// обновим профиль юзвера
				//
				# NOTE : 2008-02-29 : lucky
				# больше не обновляем: #431
				#
				#$cred = array();
				#$cred['password'] = time().'321';
				#// обновляем следующие данные из профиля
				#$cred[  'fullname'] = $user_name;
				#if (strlen(trim($user_email)) > 0)	$cred[     'email'] = $user_email;
				#
				#$acl_assistant = $this->module->aa;
				#$this->module->acl->FreezeDb();
				#$this->ctx->mm->getModel("User", "m")->UpdateUserData($cred['user_id'], $cred);
				#$this->module->acl->UnFreezeDb();
				$new_cred = array('login'=>$cred['login'], 'password' => $cred['password']);
			} else {
				// создадим профиль юзвера
				//
				// сгенерим 'случайный' пароль
				$user_password = $this->makePassForOpenid($openid_profile);

				$cred = array();
				$cred[     'login'] = $user_login;
				$cred[  'password'] = $user_password;
				$cred['openid_url'] = $user_openid_url;
				$cred[  'fullname'] = $user_name;
				$cred[     'email'] = $user_email;

				$acl_assistant = $this->module->aa;
				$this->ctx->db->begin();
				$user_obj = $this->ctx->mm->getModel("User")->AddNewUser($cred);
				$model->add_openid_to_user($user_obj, $user_openid_url);
				$this->ctx->db->end();
				$new_cred = array('login'=>$user_login, 'password' => $user_password);

				$new_user_id = $user_obj->id;
				$first_time = true;
			}

			// профиль найден (или создан новый).
			// логиним
			//
			$res = $principal->login(new RL_Principal_Input_Array($new_cred), 'login');

			// все,
			// выходим редиректясь
			if (isset($this->data['community_url'])) {
				$community_url =  $this->data['community_url'];
			}


			if (isset($openid_profile['other']['ref'])) {
				$url = $openid_profile['other']['ref'];
			} elseif ($first_time) {
				if (!$community_url)	$url = $this->ctx->rh->base_url."members/".$new_user_id."/edit";
					else $url = $this->ctx->rh->base_url . $community_url .'/members/'.$new_user_id."/edit?first_time";
			} else {
				$new_profile = $principal->getProfile();
				if (!$community_url)	$url = $this->ctx->rh->base_url."login";
					else $url = $this->ctx->rh->base_url . $community_url .'/members/'.$new_profile['user_id'];
			}
			$this->shutdown();
			$this->rh->redirect($url);
			die(); // умрет раньше -- в redirect
		}

		$this->init();
		$view                  = $this->rh->views->findByName('openid_login');
		$view->data = $this->acl_assistant->template_data;
		$view->data['error'] = $principal->error;
		$view->data['pw_recovery_url'] = $this->rh->idsrv_pwd_recovery;

		$this->rh->response->setContent($view);
	} // end of function execute

	protected function init()
	{
		$this->rh->UseClass('RL_CyrDate');
		$this->acl_assistant = $this->module->aa;

		$this->data = $this->acl_assistant->getInfo();
		$this->acl_assistant->getAvailableOperations();
	}

	//!a function
	public function makePassForOpenid ($openid_profile)
	/**
	 * Сгенерировать 'случайный' пароль.
	 *
	 * @param mixed $openid_profile профиль от Openid
	 * @access public
	 * @return string
	 */
	{
		return substr(md5(time().$openid_profile['login']), 0, 8);
	} // end of function makePassForOpenid
}

